package com.wg.net.protocols;

import com.wg.net.operations.base.OperationRequest;
import com.wg.net.operations.base.OperationResponse;
import com.wg.net.operations.base.S2SOperationRequest;
import com.wg.net.operations.base.S2SOperationResponse;

public interface IProtocol {
    /**
     * 解析消息头
     *
     * @param data 消息
     * @return 消息头
     */
    MessageHeader parseMessageHeader(byte[] data);

    /**
     * 序列化初始请求
     *
     * @param operationRequest 请求
     * @return 结果
     */
    byte[] serializeInitRequest(OperationRequest operationRequest);

    /**
     * 序列化初始响应
     *
     * @param operationResponse 响应数据
     * @return 结果
     */
    byte[] serializeInitResponse(OperationResponse operationResponse);

    /**
     * 解析操作请求
     *
     * @param data  封包
     * @param isZip 是否压缩
     * @return 操作请求
     */
    OperationRequest parseOperationRequest(byte[] data, boolean isZip);

    /**
     * 序列化操作请求
     *
     * @param operationRequest 请求
     * @param messageType      消息类型
     * @return 结果
     */
    byte[] serializeOperationRequest(OperationRequest operationRequest, MessageType messageType);

    /**
     * 解析操作请求
     *
     * @param data  封包
     * @param isZip 是否压缩
     * @return 操作请求
     */
    S2SOperationRequest parseS2SOperationRequest(byte[] data, boolean isZip);

    /**
     * 序列化操作请求
     *
     * @param operationRequest 请求
     * @param messageType      消息类型
     * @return 结果
     */
    byte[] serializeS2SOperationRequest(S2SOperationRequest operationRequest, MessageType messageType);


    /**
     * 解析操作响应
     *
     * @param data  封包
     * @param isZip 是否压缩
     * @return 操作响应
     */
    OperationResponse parseOperationResponse(byte[] data, boolean isZip);

    /**
     * 序列化操作响应
     *
     * @param operationResponse 响应
     * @param messageType       消息类型
     * @return 结果
     */
    byte[] serializeOperationResponse(OperationResponse operationResponse, MessageType messageType);

    /**
     * 解析操作响应
     *
     * @param data  封包
     * @param isZip 是否压缩
     * @return 操作响应
     */
    S2SOperationResponse parseS2SOperationResponse(byte[] data, boolean isZip);

    /**
     * 序列化操作响应
     *
     * @param operationResponse 响应
     * @param messageType       消息类型
     * @return 结果
     */
    byte[] serializeS2SOperationResponse(S2SOperationResponse operationResponse, MessageType messageType);
}
